Repository navigation
feat(spec)!: refuse an object that declares titleFormat at save and os validate, with the nameField prescription - #29499
Conversation
…rite door Claude-Session: https://claude.ai/code/session_01ADHkmQaszscubbRkbhxD9k Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ADHkmQaszscubbRkbhxD9k Co-authored-by: Claude <noreply@anthropic.com>
…and sweep pins Claude-Session: https://claude.ai/code/session_01ADHkmQaszscubbRkbhxD9k Co-authored-by: Claude <noreply@anthropic.com>
…usal sentence (#29007) Claude-Session: https://claude.ai/code/session_01ADHkmQaszscubbRkbhxD9k Co-authored-by: Claude <noreply@anthropic.com>
The new gating rule validateTitleFormatRetired joins the registry. Claude-Session: https://claude.ai/code/session_01ADHkmQaszscubbRkbhxD9k Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 13 package(s): 10 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 5 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 176 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin f27464b7de65d55c42ed0195f42a3b346a38dc48 && git checkout f27464b7de65d55c42ed0195f42a3b346a38dc48
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin dbca3ef034537269cef482b342aa4ba7169dfe42 63417d56d5216bbcf5dc0355fbe4915aad2f7dc5 && git checkout -B drift-repro dbca3ef034537269cef482b342aa4ba7169dfe42 && git merge --no-ff 63417d56d5216bbcf5dc0355fbe4915aad2f7dc5
node scripts/docs-audit/affected-docs.mjs --json dbca3ef034537269cef482b342aa4ba7169dfe42
|
|
domain:spec#1 · os-steve · session_01ADHkmPi25XXKx92Xmg4viS Head-sha: 维护者速读
席位意见:可落地,等契约复审。 席位核对 — ACCEPT ·
|
|
domain:spec#1 · os-steve · session_01ADHkmPi25XXKx92Xmg4viS Contract-review-claim: session_01ADHkmPi25XXKx92Xmg4viS · head 0885931 · 2026-11-02T16:39Z |
Claude-Session: https://claude.ai/code/session_01ADHkmQaszscubbRkbhxD9k Co-authored-by: Claude <noreply@anthropic.com>
…mat refusal (#29007) Claude-Session: https://claude.ai/code/session_01ADHkmQaszscubbRkbhxD9k Co-authored-by: Claude <noreply@anthropic.com>
…#29007) Claude-Session: https://claude.ai/code/session_01ADHkmQaszscubbRkbhxD9k Co-authored-by: Claude <noreply@anthropic.com>
|
domain:spec#1 · os-steve · session_01ADHkmPi25XXKx92Xmg4viS Contract review (delta) · head 9860117 · 2026-11-02T19:32Z Contract reviewServed-tier: Round-1 record: ① Derived judgmentsBranch delta integrity — intact. Round-1 delta ( (A) Transcripts — correct on the head, stale against (B) Kind line — half landed. ② Semver level
③ Boundary flags
④ Design judgment
Implemented-by: VERDICT: FAIL Must-fix before a PASS record: (A′) re-merge Seat addendum · 2026-11-02T19:32Z. The seat re-read B after this record was written. The PR body as served now reads A′ is the only open item, and it is a main race, not a branch defect. The dev re-merges origin/main and sets the four transcripts to the count measured on the merged tree. The seat treats that head as merge-only. It carries this review forward once |
Claude-Session: https://claude.ai/code/session_01ADHkmQaszscubbRkbhxD9k Co-authored-by: Claude <noreply@anthropic.com>
…#29007) Claude-Session: https://claude.ai/code/session_01ADHkmQaszscubbRkbhxD9k Co-authored-by: Claude <noreply@anthropic.com>
|
domain:spec#1 · os-steve · session_01ADHkmPi25XXKx92Xmg4viS Merge-only head
The branch delta is otherwise unchanged, so the seat carries the CONTRACT_REVIEW_TIER review forward to this head as PASS. It readies and queues now, so the rule count cannot move again on main. The PR's own CI and the merge-group CI are the gate for the suites the dev is still running. |
…eFormat retired by #29499) Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ADHkmRD9KKqvTU3THnute6
Requested by Steve · project thread
Fixes #29007
Clause-②: no (narrowing)
Metadata-protocol: narrowed
维护者速读
titleFormat,保存、发布、恢复和os validate都会直接拒绝,并提示改用nameField。nameField,没有就按原规则推导,titleFormat一直没生效,现在只是不再假装接受。titleFormat;其中 3 个补上了本来就在用的标题字段,用户看到的标题不变。What changes
Ruling of record 6574393684, letter B:
titleFormatis refused, not deleted and not honoured.title-format-retiredmoves out of the advisoryvalidateRecordTitleinto a new gating registry rule,validateTitleFormatRetired(packages/lint/src/validate-record-title.ts, registered inauthoring-rules.tswithsurfaces: CLI_AND_RUNTIME,runtimeTypes: ['object']). The registry is whatos validate,os build,os lintand the runtime publish gate already run, so the CLI and the metadata save gate (422 INVALID_METADATAon an active save, a draft promotion and a restore) refuse with the same finding. The message and the fix line are byte-identical to the existing prescription; no new wording.validateRecordTitlenow reportstitle-unresolvableonly.object.zod.ts: thetitleFormatdescribe gains one sentence (refused at the metadata save gate and byos validate; a stored object that carries it still parses and reads). The key stays in the schema; no conversion drops it;provisionPrimary, console ordering and ADR-0079 D3/D9 are untouched.object-title-format-refused(packages/spec/src/migrations/entries/semantic/18.object-title-format-refused.ts) with the replacement, reason and acceptance criteria; the changeset registers it.nameField. 68 system objects across platform-objects, plugin-approvals, plugin-audit, plugin-security, plugin-sharing, plugin-webhooks, service-automation, service-mailbox, service-messaging, service-realtime and service-storage droptitleFormat. 65 already declared thenameFieldthat titles them.sys_attachment(file_name),sys_audience_binding_suggestion(permission_set_name) andsys_notification_template(subject) now declare the field the registry already stamped, so every record title reads as before. Comments that described the template were rewritten in place. No example or template in the repo declared it.data-modeling/objects.mdx,schema-design.mdx,frontend/building-crud-app.mdx,docs/notes/crm-development-standards.mdx; references regenerated; four CLI transcripts now print "author-time rules (62)" (deployment/cli.mdx,deployment/validating-metadata.mdx,getting-started/build-with-claude-code.mdx,ui/react-pages.mdx).packages/spec/liveness/sharing_rule.json: the name note no longer citestitleFormat; the label evidence now cites the list view columns and sort keys.Forced test edits
These tests read
X.titleFormatfrom the shipped object to prove a formula matched the old template. The template no longer ships, so each file now keeps the retired template text in a localRETIRED_TITLE_TEMPLATESmap and readsRETIRED_TITLE_TEMPLATES[X.name]; the assertions are otherwise unchanged:packages/platform-objects/src/identity/identity-display-title.test.tspackages/plugins/plugin-approvals/src/sys-approval-delegation-display-title.test.tspackages/plugins/plugin-approvals/src/sys-approval-display-title.test.ts(one comment adjusted)packages/plugins/plugin-security/src/objects/sys-security-assignment-display-title.test.tspackages/services/service-automation/src/sys-automation-run-display-title.test.tspackages/services/service-messaging/src/objects/http-delivery-display-title.test.tspackages/services/service-messaging/src/objects/notification-display-title.test.tspackages/services/service-realtime/src/objects/sys-presence-display-title.test.tspackages/plugins/plugin-approvals/src/sys-approval-request-title.integration.test.tsasserted the shipped template; it now assertstitleFormatis undefined on the shipped object (test renamed accordingly).Tests
packages/lint/src/validate-record-title.test.ts: the refusal is an error with the prescription, the envelope and controls; the explain text names the save gate andos validate.packages/lint/src/runtime-gate.object-writes.test.ts: the rule is on the object door roster; an object carryingtitleFormatis refused; re-saving a stored row that carries it is refused, and the healed row saves.packages/metadata-protocol/src/protocol.draft-publish-verdict.test.ts: atitle-format-retiredcase in the publish verdict table; a stored object carryingtitleFormatstill loads, its next save is refused 422 with the prescription, and thenameFieldcontrol saves.packages/cli/test/validate-title-format-retired.test.ts(new, integration):os validate --jsonexits 1 withtitle-format-retiredand "migrate to nameField"; thenameFieldcontrol exits 0.packages/platform-objects/src/managed-api-method-affordance-sweep.test.ts: a repo-wide pin that no code-shipped object declarestitleFormat, with a red fixture and a control.Acceptance notes
_diagnosticsreadsvalid: falsewith this refusal, and its promotion is refused. The ruling names the save gate; I read that as the gate that already exists. Refusing drafts too would be a gate-wide change, so it is left as an open question.skills/objectstack-data/SKILL.mdstill callstitleFormat"Deprecated, not removed". It is a governed path, so this PR leaves it for a follow-up.nameFieldvalue is empty; main-path titles are unchanged (measured per object).Verification
Round 2 (head
98601175, main merged throughos-regen-merge.sh). Contract review FAIL fixes: the declaration line is nowMetadata-protocol: narrowed(a refused value is narrowed), and the four CLI transcripts print 62, the countcheck:docs-transcript-driftderives on the merged tree (#29424 landed one more rule on main). References were regenerated from the merged tree. On this head: lint, spec, platform-objects, plugin-security, service-automation, metadata-protocol and cli suites green (cli 6879 passed / 9 skipped); typecheck green for cli, lint and metadata-protocol;check:generatedgreen; dogfood battery green (397 files passed / 3 skipped; 3277 tests passed / 28 skipped; lock VERDICT command-exit 0);dispatch-gates --ran113 derived / 113 run / 0 NOT-MEASURED / 0 red;check-changeset-no-major --eventandcheck-adr-0087-registrationexit 0.Round 1 readings, on head
0885931864, underos-verify-lock(slotcard-29007).pnpm --filter @objectstack/dogfood test): 393 files passed and 3 skipped; 3243 tests passed and 28 skipped.run typecheckpassed for all 15 touched packages, including the test layers. The cli test layer ran out of memory at the default node heap; with the CI heap (--max-old-space-size=4136) it passed.dispatch-gates --ranreports 113 derived, 113 run, 0 NOT-MEASURED and 0 red.check:docs-transcript-driftstale: four CLI transcripts print "author-time rules (60)", and the new gating rule makes the count 61. This PR fixes those transcripts.check-plugin-teardown-shape --self-testexited 3 in the shallow clone. It went green after fetching its pinned commit.check-changeset-no-major.mjs --base origin/main --eventagainst this body, which acceptsno (narrowing)withnarrowed(exit 0).'error'to'warning'and the dist preflight was rerun. That turned lint red (5 tests), metadata-protocol red (2) and the clios validatetest red (1). Restoring the severity made them green again, with a clean tree and the preflight--absentcheck passing.🤖 Generated with Claude Code
https://claude.ai/code/session_01ADHkmQaszscubbRkbhxD9k